#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
PDF批量加水印工具 - GUI版本
提供图形用户界面，方便用户操作
"""

import os
import sys
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import threading
from pdf_watermarker import process_folder

class PdfWatermarkerGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF批量加水印工具")
        self.root.geometry("600x400")
        self.root.resizable(True, True)
        
        # 设置窗口图标（如果有的话）
        # self.root.iconbitmap("icon.ico")  # 需要有图标文件
        
        self.input_folder = tk.StringVar()
        self.output_folder = tk.StringVar()
        self.watermark_file = tk.StringVar(value="watermark.pdf")
        self.processing = False
        
        self.create_widgets()
        self.center_window()
    
    def center_window(self):
        """居中显示窗口"""
        self.root.update_idletasks()
        width = self.root.winfo_width()
        height = self.root.winfo_height()
        x = (self.root.winfo_screenwidth() // 2) - (width // 2)
        y = (self.root.winfo_screenheight() // 2) - (height // 2)
        self.root.geometry('{}x{}+{}+{}'.format(width, height, x, y))
    
    def create_widgets(self):
        """创建GUI界面元素"""
        # 创建主框架
        main_frame = ttk.Frame(self.root, padding="20 20 20 20")
        main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 标题
        title_label = ttk.Label(main_frame, text="PDF批量加水印工具", font=("Arial", 16, "bold"))
        title_label.pack(pady=(0, 20))
        
        # 输入文件夹
        input_frame = ttk.Frame(main_frame)
        input_frame.pack(fill=tk.X, pady=5)
        
        ttk.Label(input_frame, text="输入文件夹:").pack(side=tk.LEFT, padx=(0, 10))
        ttk.Entry(input_frame, textvariable=self.input_folder, width=50).pack(side=tk.LEFT, expand=True, fill=tk.X)
        ttk.Button(input_frame, text="浏览...", command=self.browse_input_folder).pack(side=tk.LEFT, padx=(10, 0))
        
        # 输出文件夹
        output_frame = ttk.Frame(main_frame)
        output_frame.pack(fill=tk.X, pady=5)
        
        ttk.Label(output_frame, text="输出文件夹:").pack(side=tk.LEFT, padx=(0, 10))
        ttk.Entry(output_frame, textvariable=self.output_folder, width=50).pack(side=tk.LEFT, expand=True, fill=tk.X)
        ttk.Button(output_frame, text="浏览...", command=self.browse_output_folder).pack(side=tk.LEFT, padx=(10, 0))
        
        # 水印文件
        watermark_frame = ttk.Frame(main_frame)
        watermark_frame.pack(fill=tk.X, pady=5)
        
        ttk.Label(watermark_frame, text="水印文件名:").pack(side=tk.LEFT, padx=(0, 10))
        ttk.Entry(watermark_frame, textvariable=self.watermark_file, width=50).pack(side=tk.LEFT, expand=True, fill=tk.X)
        
        # 提示信息
        tip_frame = ttk.Frame(main_frame)
        tip_frame.pack(fill=tk.X, pady=10)
        
        tip_text = "提示：水印文件应放在输入文件夹内，默认名称为watermark.pdf"
        ttk.Label(tip_frame, text=tip_text, foreground="gray").pack(anchor=tk.W)
        
        # 进度条
        self.progress_var = tk.DoubleVar()
        self.progress = ttk.Progressbar(main_frame, variable=self.progress_var, maximum=100)
        self.progress.pack(fill=tk.X, pady=10)
        
        # 状态标签
        self.status_var = tk.StringVar(value="准备就绪")
        status_label = ttk.Label(main_frame, textvariable=self.status_var)
        status_label.pack(anchor=tk.W, pady=5)
        
        # 按钮
        button_frame = ttk.Frame(main_frame)
        button_frame.pack(pady=20)
        
        self.process_button = ttk.Button(button_frame, text="开始处理", command=self.start_processing, width=20)
        self.process_button.pack(side=tk.LEFT, padx=5)
        
        ttk.Button(button_frame, text="退出", command=self.root.quit, width=20).pack(side=tk.LEFT, padx=5)
    
    def browse_input_folder(self):
        """浏览选择输入文件夹"""
        folder = filedialog.askdirectory(title="选择包含PDF文件的文件夹")
        if folder:
            self.input_folder.set(folder)
            # 如果没有指定输出文件夹，默认为输入文件夹下的"水印处理结果"子文件夹
            if not self.output_folder.get():
                self.output_folder.set(os.path.join(folder, "水印处理结果"))
    
    def browse_output_folder(self):
        """浏览选择输出文件夹"""
        folder = filedialog.askdirectory(title="选择处理结果保存文件夹")
        if folder:
            self.output_folder.set(folder)
    
    def start_processing(self):
        """开始处理文件"""
        # 检查输入文件夹
        input_folder = self.input_folder.get()
        if not input_folder:
            messagebox.showerror("错误", "请选择输入文件夹！")
            return
        
        if not os.path.exists(input_folder):
            messagebox.showerror("错误", f"输入文件夹不存在: {input_folder}")
            return
        
        # 检查水印文件
        watermark_file = self.watermark_file.get()
        watermark_path = os.path.join(input_folder, watermark_file)
        if not os.path.exists(watermark_path):
            messagebox.showerror("错误", f"水印文件不存在: {watermark_path}")
            return
        
        # 检查输出文件夹
        output_folder = self.output_folder.get()
        if not output_folder:
            self.output_folder.set(os.path.join(input_folder, "水印处理结果"))
            output_folder = self.output_folder.get()
        
        # 创建输出文件夹（如果不存在）
        if not os.path.exists(output_folder):
            try:
                os.makedirs(output_folder)
            except Exception as e:
                messagebox.showerror("错误", f"无法创建输出文件夹: {e}")
                return
        
        # 防止重复点击
        if self.processing:
            return
        
        self.processing = True
        self.process_button.config(state=tk.DISABLED)
        self.status_var.set("处理中...")
        self.progress_var.set(0)
        
        # 使用线程处理，避免UI卡死
        thread = threading.Thread(target=self.process_files, args=(input_folder, output_folder, watermark_file))
        thread.daemon = True
        thread.start()
    
    def process_files(self, input_folder, output_folder, watermark_file):
        """在后台处理文件"""
        try:
            # 计算总PDF文件数（用于进度条）
            total_files = sum(1 for f in os.listdir(input_folder) 
                             if f.lower().endswith('.pdf') and f != watermark_file)
            
            if total_files == 0:
                self.root.after(0, lambda: messagebox.showwarning("警告", "在输入文件夹中没有找到PDF文件！"))
                self.root.after(0, self.reset_ui)
                return
            
            # 处理文件
            processed_count = 0
            
            # 获取水印页面
            from pdf_watermarker import get_watermark, add_watermark_to_pdf
            watermark_path = os.path.join(input_folder, watermark_file)
            watermark_page = get_watermark(watermark_path)
            
            if watermark_page is None:
                self.root.after(0, lambda: messagebox.showerror("错误", "无法读取水印文件！"))
                self.root.after(0, self.reset_ui)
                return
            
            # 遍历处理每个PDF文件
            for filename in os.listdir(input_folder):
                if filename.lower().endswith('.pdf') and filename != watermark_file:
                    # 更新状态
                    self.root.after(0, lambda f=filename: self.status_var.set(f"正在处理: {f}"))
                    
                    # 处理文件
                    input_path = os.path.join(input_folder, filename)
                    output_path = os.path.join(output_folder, filename)
                    
                    if add_watermark_to_pdf(input_path, watermark_page, output_path):
                        processed_count += 1
                    
                    # 更新进度条
                    progress = (processed_count / total_files) * 100
                    self.root.after(0, lambda p=progress: self.progress_var.set(p))
            
            # 完成处理
            self.root.after(0, lambda: self.status_var.set(f"处理完成! 共处理 {processed_count} 个文件"))
            self.root.after(0, lambda: messagebox.showinfo("完成", f"已成功处理 {processed_count} 个PDF文件!\n结果保存在: {output_folder}"))
            
            # 自动打开输出文件夹
            if processed_count > 0:
                if sys.platform == 'win32':
                    os.startfile(output_folder)
                elif sys.platform == 'darwin':  # macOS
                    os.system('open "{}"'.format(output_folder))
                else:  # Linux
                    os.system('xdg-open "{}"'.format(output_folder))
        
        except Exception as e:
            self.root.after(0, lambda: messagebox.showerror("错误", f"处理过程中发生错误:\n{str(e)}"))
        
        finally:
            self.root.after(0, self.reset_ui)
    
    def reset_ui(self):
        """重置UI状态"""
        self.processing = False
        self.process_button.config(state=tk.NORMAL)

def main():
    root = tk.Tk()
    app = PdfWatermarkerGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main() 